home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / x68000.arc / SOURCE.ARC / ERRORX68.MOD < prev    next >
Text File  |  1986-01-23  |  5KB  |  174 lines

  1. IMPLEMENTATION MODULE ErrorX68;
  2. (* Displays error messages for X68000 cross assembler *)
  3.  
  4.    FROM Terminal IMPORT
  5.       WriteString, WriteLn;
  6.  
  7.    IMPORT Terminal;   (* for Read/Write *)
  8.  
  9.    FROM FileSystem IMPORT
  10.       File;
  11.  
  12.    IMPORT FileSystem;   (* for WriteChar *)
  13.  
  14.    FROM Strings IMPORT
  15.       Length;
  16.  
  17.    FROM Conversions IMPORT
  18.       ConvertCardinal;
  19.  
  20.    IMPORT ASCII;
  21.  
  22.    FROM Parser IMPORT
  23.       Line, LineCount;
  24.  
  25.  
  26. (*---
  27.    TYPE
  28.       ErrorType = (Dummy, TooLong, NoCode, SymDup, Undef, SymFull, Phase,
  29.                    ModeErr, OperErr, BraErr, AddrErr, SizeErr, EndErr);
  30.  
  31.    VAR
  32.       ErrorCount : CARDINAL;
  33.                                                                   ---*)
  34.  
  35.    VAR
  36.       FirstTime : BOOLEAN;
  37.  
  38.  
  39.  
  40.    PROCEDURE FileWriteString (VAR f : File; Str : ARRAY OF CHAR);
  41.  
  42.       VAR
  43.          i : CARDINAL;
  44.          top : CARDINAL;
  45.  
  46.       BEGIN
  47.          top := HIGH (Str);
  48.          i := 0;
  49.          WHILE (i <= top) AND (Str[i] # 0C) DO
  50.             FileSystem.WriteChar (f, Str[i]);
  51.             INC (i);
  52.          END;
  53.       END FileWriteString;
  54.  
  55.  
  56.  
  57.    PROCEDURE Error (Pos : CARDINAL; ErrorNbr : ErrorType);
  58.    (* Displays Error #ErrorNbr, then waits for any key to continue *)
  59.  
  60.       VAR
  61.          i : CARDINAL;
  62.          c : CHAR;
  63.          CntStr : ARRAY [0..6] OF CHAR;
  64.  
  65.       BEGIN
  66.          WriteLn;
  67.          ConvertCardinal (LineCount, 1, CntStr);
  68.          WriteString (CntStr);
  69.          WriteString ("   ");
  70.          WriteString (Line);   WriteLn;
  71.  
  72.          (* Make up for LineCnt so ^ in right spot *)
  73.          FOR i := 1 TO Length (CntStr) DO
  74.             Terminal.Write (' ');
  75.          END;
  76.          WriteString ("   ");
  77.  
  78.          IF Pos > 0 THEN
  79.             FOR i := 1 TO Pos DO
  80.                Terminal.Write (' ');
  81.             END;
  82.             Terminal.Write ('^');   WriteLn;
  83.          END;
  84.          
  85.          CASE ErrorNbr OF
  86.             TooLong : WriteString ("Identifier too long -- Truncated!");
  87.          |  NoCode  : WriteString ("No such op-code.");
  88.          |  SymDup  : WriteString ("Duplicate Symbol.");
  89.          |  Undef   : WriteString ("Undefined Symbol.");
  90.          |  SymFull : WriteString ("Symbol Table Full -- Maximum = 500!");
  91.                       WriteLn;
  92.                       WriteString ("Program Terminated.");   WriteLn;
  93.                       HALT;
  94.          |  Phase   : WriteString ("Pass 1/Pass 2 Address Count Mis-Match.");
  95.          |  ModeErr : WriteString ("This addressing mode not allowed here.");
  96.          |  OperErr : WriteString ("Error in operand format.");
  97.          |  BraErr  : WriteString ("Error in relative branch.");
  98.          |  AddrErr : WriteString ("Address mode error.");
  99.          |  SizeErr : WriteString ("Operand size error.");
  100.          |  EndErr  : WriteString ("Missing END Pseudo-Op.");
  101.          ELSE
  102.             WriteString ("Unknown Error.");
  103.          END;
  104.          WriteLn; 
  105.  
  106.          IF FirstTime THEN
  107.             WriteString ("Hit any key to continue (^C to Terminate) .... ");
  108.             Terminal.Read (c);   
  109.             WriteLn;
  110.             FirstTime := FALSE;
  111.          ELSE
  112.             Terminal.Read (c);
  113.          END;
  114.          
  115.          INC (ErrorCount);
  116.          IF ErrorCount > 500 THEN
  117.             WriteString ("Too many errors!");   WriteLn;
  118.             WriteString ("Program Terminated.");   WriteLn;
  119.             HALT;
  120.          END;
  121.       END Error;
  122.  
  123.  
  124.  
  125.    PROCEDURE WriteErrorCount (VAR f : File);
  126.    (* Error count output to Console & Listing file *)
  127.  
  128.       VAR
  129.          CntStr : ARRAY [0..6] OF CHAR;
  130.          Msg0 : ARRAY [0..25] OF CHAR;
  131.          Msg1 : ARRAY [0..10] OF CHAR;
  132.          Msg2 : ARRAY [0..20] OF CHAR;
  133.  
  134.       BEGIN
  135.          Msg0 := "--->   END OF ASSEMBLY";
  136.          Msg1 := "--->   ";
  137.          Msg2 := " ASSEMBLY ERROR(S).";
  138.          ConvertCardinal (ErrorCount, 1, CntStr);
  139.             
  140.          (* Messages to console *)
  141.          WriteLn;
  142.          WriteLn;
  143.          WriteString (Msg0);   WriteLn;
  144.          WriteString (Msg1);
  145.          WriteString (CntStr);
  146.          WriteString (Msg2);
  147.          WriteLn;
  148.  
  149.          (* Messages to listing file *)
  150.          FileSystem.WriteChar (f, ASCII.cr);   
  151.          FileSystem.WriteChar (f, ASCII.lf);
  152.          FileSystem.WriteChar (f, ASCII.cr);   
  153.          FileSystem.WriteChar (f, ASCII.lf);
  154.  
  155.          FileWriteString (f, Msg0);
  156.          FileSystem.WriteChar (f, ASCII.cr);   
  157.          FileSystem.WriteChar (f, ASCII.lf);
  158.  
  159.          FileWriteString (f, Msg1);
  160.          FileWriteString (f, CntStr);
  161.          FileWriteString (f, Msg2);
  162.          FileSystem.WriteChar (f, ASCII.cr);   
  163.          FileSystem.WriteChar (f, ASCII.lf);
  164.  
  165.          FileSystem.WriteChar (f, ASCII.ff);   (* feed up next page *)
  166.       END WriteErrorCount;
  167.  
  168.  
  169. BEGIN   (* MODULE Initialization *)
  170.    FirstTime := TRUE;
  171.    ErrorCount := 0;
  172. END ErrorX68.
  173.  
  174.